<?php
class GruposController extends AppController{

    var $name = 'Grupos';
    var $appModule = 'Seguridad';
    var $helpers = array('Html','Form','Javascript','Paginator','Codigo','GetList');
    var $components = array('RequestHandler', 'Acl');
    var $uses = array('Grupo', 'ArosAco', 'Aco', 'Aro', 'ArosEmpresa', 'ArosCentroDist', 'Empresa', 
        'CentroDist','Usuario');
    var $pageTitle = 'ADC corporation';
    var $paginate = array(
        'order' => array('Grupo.codigo' => 'ASC'));

    function index() {        
        $conditions['Grupo.activo'] = true;
        $q = $this->getBusqueda($this->data['Grupo']['busqueda']);
        $this->paginate['limit']=$this->limite;
        if (!empty($q)) {
            $conditions['OR'] = array(
                'Grupo.codigo SIMILAR TO' => '%'.$q.'%',
                'Grupo.descripcion SIMILAR TO' => '%'.$q.'%'
            );
        }
        $this->paginate['Grupo'] = array(
            'conditions'=>$conditions,
            'order'=>'codigo'
        );
        $grupos = $this->paginate('Grupo');
        $this->set('grupos', $grupos);
        $this->set('limite', $this->limite);
        $this->data['UnidadMedida']['pagesize']=$this->limite;

    }

    function view($id = null){
        if (!$id && empty($this->data)) {
                $this->Session->setFlash(__('Grupo invalido', true));
                $this->redirect(array('action'=>'index'));
        }
        if (!empty($this->data)) {
            $action = $this->data['ArosAco']['action'];
            //estableciendo el objeto
            $aco = $this->data['ArosAco']['aco_id'];
            $acoNode = $this->Aro->recursive = -1;
            $acoNode = $this->Aco->read(null, $aco);
            $acoStr = $acoNode['Aco']['alias'];
            while (!empty($acoNode['Aco']['parent_id'])){
                $acoNode = $this->Aco->read(null, $acoNode['Aco']['parent_id']);
                if (!empty($acoNode['Aco']['id']) && array_key_exists('alias', $acoNode['Aco'])){
                    $acoStr = $acoNode['Aco']['alias'].'/'.$acoStr;
                }
            }
            // estableciendo el Requester
            $aro = $this->data['ArosAco']['aro_id'];
            $aro = array('model'=>'Grupo', 'foreign_key'=>$aro);
            // establecer el comando (*, create, read, update, delete)
            if (!empty($this->data['ArosAco']['all'])){
                $commands = '*';
            } else {
                $commands = array();
                $keys = array_keys($this->data['ArosAco']['commands']);
                foreach($keys as $k){
                    if ($action == 1){
                        if ($this->data['ArosAco']['commands'][$k] == 1){
                            $commands = array_merge($commands, array($k));
                        }
                    } else {
                        if ($this->data['ArosAco']['commands'][$k] != 1){
                            $commands = array_merge($commands, array($k));
                        }
                    }
                }
            }
            // allowing or dening
            $this->Acl->allow($aro, $acoStr, $commands, $action);
        }
        $this->Grupo->recursive = 1;
        $this->set('grupo', $this->Grupo->read(null, $id));

        $this->Aco->bindModel(array(
            'belongsTo'=>array(
                'Aco'=>array('className'=>'Aco','foreignKey'=>'parent_id')
            )
        ));
        $this->ArosAco->Behaviors->attach('Containable');
        $data = $this->ArosAco->find('all', array(
            'conditions'=>array(
                'Aro.foreign_key'=>$id,
                'Aro.model'=>'Grupo'
            ),
            'contain'=>array(
                'Aro',
                'Aco'=>array(
                    'Aco'=>array(
                        'Aco'
                    )
                )
            )
        ));
        $this->set('permissions', $data);
        $this->set('acos',
                $this->Aco->find('list', array(
                    'fields'=>array('id', 'alias'),
                    'order'=>array('lft', 'rght'),
                    'recursive'=>-1
                )
        ));
    }

    function add() {
        if (!empty($this->data)) {
            $this->Grupo->begin();
            // inicializando valores
            $this->Grupo->create();
            $usuario = $this->Session->read('Usuario');
            $this->data['Grupo']['empresa_id'] = $usuario['Tercero']['empresa_id'];
            $this->data['Grupo']['centro_dist_id'] = $usuario['Tercero']['centro_dist_id'];
            $this->data['Grupo']['descripcion'] = up($this->data['Grupo']['descripcion']);
            $this->data['Grupo']['usuario_creacion_id'] = $usuario['id'];
            $this->data['Grupo']['fecha_creacion'] = 'now()';
            $this->data['Grupo']['activo'] = 1;
            $centroDist = $this->CentroDist->find('first',array(
                'conditions'=>array('id'=>$this->centroDistId()),
                'recursive'=>-1
            ));
            $this->data['Grupo']['dominio'] = sprintf('%s.%s', low(str_replace(' ','_',$this->data['Grupo']['descripcion'])), low($centroDist['CentroDist']['dominio']));

            if ($this->Grupo->save($this->data)) {
                $this->Grupo->commit();
                //$this->Acl->
                $this->Session->setFlash(__('El Grupo ha sido guardado', true));
                $this->redirect(array('action'=>'index'));
            } else {
                $this->Grupo->rollback();
                $this->Session->setFlash(__('El Grupo no ha sido guardado.', true));
            }
        } else {
            $sql = 'SELECT MAX(codigo) AS "Grupo__codigo" FROM grupos WHERE empresa_id = %s';
            $grupo = $this->Grupo->query(sprintf($sql,$this->empresaId()));
            if (isset($grupo[0]['Grupo']['codigo']) && !empty($grupo[0]['Grupo']['codigo']))
                $grupo = $grupo[0]['Grupo']['codigo'];
            else
                $grupo = 0;
            $grupo++;
            $grupo = str_repeat('0', 3-strlen($grupo)).$grupo;
            $this->set(compact('grupo'));
        }
    }

    function edit($id = null) {
        if (!$id && empty($this->data)) {
                $this->Session->setFlash(__('Grupo invalido', true));
                $this->redirect(array('action'=>'index'));
        }
        if (!empty($this->data)) {
                $this->Grupo->begin();
                $usuario = $this->Session->read('Usuario');
                $this->data['Grupo']['descripcion'] = up($this->data['Grupo']['descripcion']);
                $this->data['Grupo']['Grupo_modificacion_id'] = $usuario['id']; // cambiar por session
                $this->data['Grupo']['fecha_modificacion'] = 'now()';
                $centroDist = $this->CentroDist->find('first',array(
                    'conditions'=>array('id'=>$this->centroDistId()),
                    'recursive'=>-1
                ));
                $this->data['Grupo']['dominio'] = sprintf('%s.%s', low(str_replace(' ','_',$this->data['Grupo']['descripcion'])), low($centroDist['CentroDist']['dominio']));

                if ($this->Grupo->save($this->data)) {
                     $this->Usuario->query('UPDATE seguridad.usuarios a SET email=(
                         SELECT LOWER(b.usuario)||\'@\'||LOWER(grupos.dominio)
                         FROM seguridad.usuarios b
                         LEFT JOIN seguridad.grupos ON grupos.id=b.grupo_id
                         WHERE a.id=b.id)');
                     
                    $this->Grupo->commit();
                    $this->Session->setFlash(__('El Grupo ha sido guardado.', true));
                    $this->redirect(array('action'=>'index'));
                } else {
                    $this->Grupo->rollback();
                    $this->Session->setFlash(__('El Grupo no ha sido guardado. Por fravor, intente nuevamente.', true));
                }
        }
        if (empty($this->data)) {
                $this->Grupo->recursive = 2;
                $this->set('grupo', $this->Grupo->read(null, $id));
                $this->data = $this->Grupo->read(null, $id);
        }
    }

    function delete($id = null, $verbose = true) {
        if ($id == null) {
            if ($verbose){
                $this->Session->setFlash(__('Id de Grupo invalido', true));
                $this->redirect(array('action'=>'index'));
            }
            else return false;
        }
        $this->Grupo->begin();
        $this->Grupo->recursive = -1;
        $data = $this->Grupo->read(null, $id);
        $usuario = $this->Session->read('Usuario');
        $data['Grupo']['activo']=0;
        $data['Grupo']['Grupo_borrado_id']=$usuario['id'];
        $data['Grupo']['fecha_borrado']='now()';
        //eliminando el Grupo
        if (!$this->Grupo->save($data) && !verbose){
            $this->Grupo->rollback();
            return false;
        }
        if ($verbose){
            $this->Grupo->commit();
            $this->Session->setFlash(__('Nota de Credito eliminado', true));
            $this->redirect(array('action'=>'index'));
        }
        else{
            $this->Grupo->commit();
            return true;
        }
    }

    function process(){// procesa anulaciones y eliminaciones en bloque
        //$this->autoRender = false;
        $op = isset($this->params['form']['cancel'])?'anular':'eliminar';
        $flag = true;
        $i = 0;
        foreach($this->data as $item){
            if ($item['id']!='0'){
                if(isset($this->params['form']['cancel'])){ // anular
                    $flag = $this->cancel($item['Grupo']['id'], false);
                } else { //eliminar
                    $flag = $this->delete($item['Grupo']['id'], false);
                }
                if (!$flag){
                    $data = $this->Grupo->read(null, $item['id']);
                    $this->Session->setFlash(__("Se ha producido un error al $op el Grupo #".$data['Grupo']['Grupo'], true));
                    break;
                }
                //else echo $item['id'].'<br/>';
            }
            $i++;
        }
        if ($flag && $i++){
            $this->Session->setFlash(__("El proceso de $op Grupos se ha realizado con exito.", true));
        }
        $this->redirect(array('action'=>'index'));
    }

    function deletePermission($id = null, $verbose = true, $grupoId =null) {
        if ($id == null) {
            if ($verbose){
                $this->Session->setFlash(__('Id de Permiso invalido', true));
                if (empty($groupId))
                    $this->redirect(array('action'=>'index'));
                else
                    $this->redirect(array('action'=>'view',$permissions));
            }
            else return false;
        }
        //eliminando el Grupo
        
        $this->ArosAco->recursive = -1;
        if (!$this->ArosAco->delete(array('id'=>$id)) && !verbose){            
            return false;
        }
        if ($verbose){
            $this->Session->setFlash(__('Permiso eliminado', true));
                if (empty($groupId))
                    $this->redirect(array('action'=>'index'));
                else
                    $this->redirect(array('action'=>'view',$permissions));
        }
        else{
            return true;
        }
    }

    function processPermissions(){// procesa anulaciones y eliminaciones en bloque
        $op = isset($this->params['form']['cancel'])?'anular':'eliminar';
        $flag = true;
        $i = 0;
        foreach($this->data['Permissions'] as $item){
            if ($item['id']!='0'){
                if(isset($this->params['form']['delete'])){ // anular
                    $flag = $this->deletePermission($item['id'], false);
                } 
                if (!$flag){
                    $this->Session->setFlash(__("Se ha producido un error al $op el Permiso #".$item['id'], true));
                    break;
                }
            }
            $i++;
        }
        if ($flag && $i++){
            $this->Session->setFlash(__("El proceso de $op Permisos se ha realizado con exito.", true));
        }
        $this->redirect(array('action'=>'view', $this->data['Grupo']['id']));
    }

    function addEmpresa($id = null){
        if ($id == null) {
            $this->Session->setFlash(__('Id de Grupo invalido', true));
            $this->redirect(array('action'=>'index'));
        }
        if (!empty($this->data)){
            if (isset($this->params['form']['grabar'])){ // cuando adiciona
                $_aro = $this->Aro->find('first',array('conditions'=>array('model'=>'Grupo','foreign_key'=>$id),'recursive'=>-1));
                $this->data['ArosEmpresa']['aro_id']=$_aro['Aro']['id'];
                $this->ArosEmpresa->create($this->data['ArosEmpresa']);
                if ($this->ArosEmpresa->save()){
                    $this->Session->setFlash('Se ha realizado el vinculo correctamente');
                } else {
                    $this->Session->setFlash('Se ha producido un error al vincular la empresa');
                }
            } else { // cuando elimina
                foreach($this->data as $data){
                    if (array_key_exists('id', $data) && $data['id']!=0){
                        $this->ArosEmpresa->recursive = -1;
                        $aroempresa = $this->ArosEmpresa->read(null, $data['id']);
                        if (!$this->ArosEmpresa->remove($aroempresa['ArosEmpresa'])){
                            $this->Session->setFlash('Se ha producido un error al eliminar el vinculo con la empresa');
                            break;
                        }
                    }
                }

            }
        }
        $grupo = $this->Grupo->find('first',array('conditions'=>array('id'=>$id),'recursive'=>-1));
        $aro = $this->Aro->find('first',array('conditions'=>array('model'=>'Grupo','foreign_key'=>$id),'recursive'=>-1));
        $this->ArosEmpresa->Behaviors->attach('Containable');
        $aroempresas = $this->ArosEmpresa->find('all', array(
            'fields'=>array('id','aro_id','empresa_id'),
            'conditions'=>array('aro_id'=>$aro['Aro']['id']),
            'contain'=>array(
                'Empresa'=>array('fields'=>array('razon_social','nombre_comercial'))
            ),
            'order'=>'Empresa.codigo'
        ));
        $this->set('q','');
        $this->set('limite',2000);
        $this->set('grupo', $grupo);
        $this->set('aroempresas', $aroempresas);
        $this->set('empresas', $this->Empresa->find('list', array(
            'fields'=>array('id','razon_social'),
            'conditions'=>array('activo'=>true),
            'order'=>'Empresa.codigo',
            'recursive'=>-1
        )));
    }

    function addCentroDist($id = null){
        if ($id == null) {
            $this->Session->setFlash(__('Id de Grupo invalido', true));
            $this->redirect(array('action'=>'index'));
        }
        if (!empty($this->data)){
            if (isset($this->params['form']['grabar'])){ // cuando adiciona
                $_aro = $this->Aro->find('first',array('conditions'=>array('model'=>'Grupo','foreign_key'=>$id),'recursive'=>-1));
                $this->data['ArosCentroDist']['aro_id']=$_aro['Aro']['id'];
                $this->ArosCentroDist->create($this->data['ArosCentroDist']);
                if ($this->ArosCentroDist->save()){
                    $this->Session->setFlash('Se ha realizado el vinculo correctamente');
                } else {
                    $this->Session->setFlash('Se ha producido un error al vincular el deposito');
                }
            } else { // cuando elimina
                foreach($this->data as $data){
                    if (array_key_exists('id', $data) && $data['id']!=0){
                        $this->ArosCentroDist->recursive = -1;
                        $arodeposito = $this->ArosCentroDist->read(null, $data['id']);
                        if (!$this->ArosCentroDist->remove($arodeposito['ArosCentroDist'])){
                            $this->Session->setFlash('Se ha producido un error al eliminar el vinculo con el deposito');
                            break;
                        }
                    }
                }

            }
        }
        $grupo = $this->Grupo->find('first',array('conditions'=>array('id'=>$id),'recursive'=>-1));
        $aro = $this->Aro->find('first',array('conditions'=>array('model'=>'Grupo','foreign_key'=>$id),'recursive'=>-1));
        $this->ArosCentroDist->Behaviors->attach('Containable');
        $arodepositos = $this->ArosCentroDist->find('all', array(
            'fields'=>array('id','aro_id','centro_dist_id'),
            'conditions'=>array('aro_id'=>$aro['Aro']['id']),
            'contain'=>array(
                'CentroDist'=>array('fields'=>array('codigo','descripcion','descripcion_corta', 'simbolo', 'direccion'))
            ),
            'order'=>'CentroDist.codigo'
        ));
        $this->set('q','');
        $this->set('limite',2000);
        $this->set('grupo', $grupo);
        $this->set('arodepositos', $arodepositos);
        $this->set('centroDists', $this->CentroDist->find('list', array(
            'fields'=>array('id','descripcion'),
            'conditions'=>array('activo'=>true),
            'order'=>'CentroDist.codigo',
            'recursive'=>-1
        )));
    }
    
	public function buscar($q = null){
		if(!empty($this->data['Grupo']['q'])){
			$q = $this->data['Grupo']['q'];
		} elseif (!empty($this->params['url']['q'])){
			$q = $this->params['url']['q'];
		} elseif (!empty($this->params['form']['q'])){
			$q = $this->params['form']['q'];
		}
		
		if(empty($q)){
			$result = array('Error'=>'No se establecieron los parámetros adecuadamente');
		} else {
			$conditions = array(
						'Grupo.activo' => true,
						'Grupo.centro_dist_id' => $this->centroDistId(),
						'Grupo.empresa_id' => $this->empresaId());
			$params = explode('_ID_', $q);			
			if( count($params) == 2){
				$conditions['Grupo.id'] = $params[1];
			} else {
				$conditions['OR']=array('Grupo.codigo iLike'=>strtoupper($q).'%');
			}			
			
			$fields = array(
				'Grupo.id',				
				'Grupo.codigo',	
				'Grupo.descripcion'				
			);
			
			$this->Grupo->Behaviors->attach('Containable');
			$result = $this->Grupo->find('all', array(
				'conditions' => $conditions,
				'fields' => $fields,
				'order'=>array('Grupo.codigo ASC'),
				));
		}		
		//definiendo valores en caso q sea una petición para autocompletado
		if(!empty($this->params['url']['autocomplete']) || !empty($this->params['form']['autocomplete'])){
			$res = array();
			foreach($result as $value){
				$res[] = array('value'=>'_ID_'.$value['Grupo']['id'], 'display'=>'<span style="color:gray;font-size:.9em">'.$value['PlantillaMateriaPrima']['producto_codigo'].'</span><div style="float:right;font-size:.8em" title="'.$value['PlantillaMateriaPrima']['producto_descripcion'].'">'. $this->neat_trim($value['Grupo']['descripcion'], 24) .'</div>');
			}
			$result = $res;
		}
	
		if ($this->RequestHandler->isAjax()){
			$this->_ajaxify($result);
		} else {
			return $result;
		}
	}
}
?>
